package com.xiaoshuidi.cloud.module.contract.service.contract;

import com.xiaoshuidi.cloud.framework.common.pojo.PageResult;
import com.xiaoshuidi.cloud.module.contract.controller.admin.contract.vo.signingSubject.*;
import com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.SigningSubjectDO;

import javax.validation.Valid;
import java.util.List;

/**
 * 合同签约主体 Service 接口
 *
 * @author 合房租赁
 */
public interface SigningSubjectService {

    /**
     * 创建合同签约主体
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    Long createSigningSubject( SigningSubjectCreateReqVO createReqVO);

    /**
     * 更新合同签约主体
     *
     * @param updateReqVO 更新信息
     */
    void updateSigningSubject( SigningSubjectUpdateReqVO updateReqVO);

    /**
     * 删除合同签约主体
     *
     * @param id 编号
     */
    void deleteSigningSubject(Long id);

    /**
     * 获得合同签约主体
     *
     * @param id 编号
     * @return 合同签约主体
     */
    SigningSubjectRespVO getSigningSubject(Long id);

    /**
     * 获得合同签约主体列表
     *
     * @return 合同签约主体列表
     */
    List<SigningSubjectRespVO> getSigningSubjectList();

    /**
     * 关联主体
     *
     * @return 关联主体参数
     */
    void relationApartment(SigningSubjectRefApartmentReqVO reqVO);

    /**
     * 获得合同签约主体分页
     *
     * @param pageReqVO 分页查询
     * @return 合同签约主体分页
     */
    PageResult<SigningSubjectRespVO> getSigningSubjectPage(SigningSubjectPageReqVO pageReqVO);

    /**
     * 根据房源ID查询主体关联的房源
     * @param apartmentId
     * @return: com.xiaoshuidi.cloud.module.contract.dal.dataobject.contract.ContractSubjectRoomRefDO
     */
    SigningSubjectDO getSubjectByApartmentId(Long apartmentId);


    /**
     * 查询非当前主体下已关联主体的门店
     * @param id
     * @return: java.util.List<java.lang.Long>
     */
    List<Long> getRefApartmentList(Long id);

    /**
     * 创建合同签约主体获取实名认证地址
     *
     * @param createReqVO 创建信息
     * @return 实名认证地址
     */
    String createSubjectGetUrl( SigningSubjectCreateReqVO createReqVO);

    /**
     * 企业认证回调
     * @param reqVO
     * @return: void
     */
    void authCallback(SigningSubjectAuthCallbackReqVO reqVO);

    /**
     * 签约主体获取自动签约地址
     * @param id
     * @return: java.lang.String
     */
    String getAutoSignUrl(Long id);

    /**
     * 授权自动签约回调
     * @param reqVO
     * @return: void
     */
    void autoSignCallback(AutoSignCallbackReqVO reqVO);


    /**
     * 签约主体印章上传
     * @param reqVO
     * @return: void
     */
    void addSubjectSignature(SigningSubjectAddSignatureReqVO reqVO);

    /**
     * 同步自动签约数据
     * @param id
     * @return: void
     */
    void syncAutoSign(Long id);

    /**
     * 线上签约判断
     * @param roomId
     * @param templateType
     * @return: java.lang.Boolean
     */
    Boolean onlineSignCheck(Long roomId,String templateType);

}
